package com.lihepeng.leecode.tree;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 二叉树的堂兄弟 节点
 * 在二叉树中，根节点位于深度 0 处，每个深度为 k 的节点的子节点位于深度 k+1 处。
 *
 * 如果二叉树的两个节点深度相同，但 父节点不同 ，则它们是一对堂兄弟节点。
 *
 * 我们给出了具有唯一值的二叉树的根节点 root ，以及树中两个不同节点的值 x 和 y 。
 *
 * 只有与值 x 和 y 对应的节点是堂兄弟节点时，才返回 true 。否则，返回 false。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/cousins-in-binary-tree
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class Solution993 {
    int x;
    TreeNode xParent;
    int xDepth;
    boolean xFound = false;

    int y ;
    TreeNode yParent;
    int yDepth;
    boolean yFound = false;
    /**
     * BFS
     * 广度优先 遍历
     * 借助Queue 数据结构
     *
     * @param root
     * @param x
     * @param y
     * @return
     */
    public boolean isCousins(TreeNode root, int x, int y) {
        this.x = x;
        this.y = y;

        Queue<TreeNode> nodeQueue = new LinkedList<>();
        Queue<Integer> deepthQueue = new LinkedList<>();
        nodeQueue.offer(root);
        deepthQueue.offer(0);



        return false;
    }

    /**
     * DFS  深度优先遍历
     * 借助 栈数据结构
     *
     * @param root
     * @param x
     * @param y
     * @return
     */
    public boolean isCousins02(TreeNode root, int x, int y) {
        this.x = x;
        this. y = y;
        dfs(root,0,null);
        return xDepth == yDepth && xParent != yParent;
    }

    /**
     * 深度优先遍历
     * 递归
     * @param node
     * @param depth 深度
     * @param parent
     */
    private void dfs(TreeNode node, int depth, TreeNode parent) {
        if (node == null){
            return;
        }
        if (node.val == x){
            this.xParent = parent;
            xDepth = depth;
            xFound = true;
        }else if (node.val == y){
            this.yParent = parent;
            yDepth = depth;
            yFound = true;
        }
        if (xFound && yFound){
            return;
        }
        dfs(node.left,depth+1,node);
        if (xFound && yFound){
            return;
        }
        dfs(node.right,depth,node);
    }


}
